%% Copyright (C) 2013 
%% 
%% This program is free software; you can redistribute it and/or modify
%% it under the terms of the GNU General Public License as published by
%% the Free Software Foundation; either version 2 of the License, or
%% (at your option) any later version.
%% 
%% This program is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%% GNU General Public License for more details.
%% 
%% You should have received a copy of the GNU General Public License
%% along with Octave; see the file COPYING.  If not, see
%% <http://www.gnu.org/licenses/>.

%% [ CaminhoFormiga ] = Heu2OPT (CaminhoFormiga, MatDistancia)
%% CaminhoFormiga pode ser uma estrututa com objetos caminho e comprimento
%% ou um vetor de caminho


function [ CaminhoFormiga ] = Heu2OPT (CaminhoFormiga, MatDistancia)
	
	if(isstruct(CaminhoFormiga))
		SeqCidades = CaminhoFormiga.caminho;
		N = length(SeqCidades) - 1;	%% -1 devido ao fato de voltar ao inicio
		comprimentoatual = CaminhoFormiga.comprimento;
	else
		SeqCidades = CaminhoFormiga;
		N = length(SeqCidades) - 1;	%% -1 devido ao fato de voltar ao inicio
		comprimentoatual = calcula_comprimento(N, SeqCidades, MatDistancia);
	end%if
	
	vertices = round(N*rand(1, 2));	%% Vetor contendo posições do vetor solucao.caminho que guiarão as arestas a serem trocadas.
	j2 = SeqCidades(vertices(1)+1);
	k2 = SeqCidades(vertices(2)+1);
	SeqCidades(vertices(1)+1) = k2;
	SeqCidades(vertices(2)+1) = j2;
	
	comprimentonovo = calcula_comprimento(N, SeqCidades, MatDistancia);
	
	if(comprimentonovo > comprimentoatual)	%% desfaz o que tinha feito
		SeqCidades(vertices(1)+1) = j2;
		SeqCidades(vertices(2)+1) = k2;
	elseif(isstruct(CaminhoFormiga))
%  		CaminhoFormiga.comprimento = comprimentonovo;
%  		CaminhoFormiga.comprimento = SeqCidades;
%  	else
%  		CaminhoFormiga = SeqCidades;
	end%if
	
end%function


% function [ solucao ] = Heu2OPT (solucao, MatDistancia)
% 	
% 	N = length(solucao.caminho) - 1;	%% -1 devido ao fato de voltar ao inicio
% 	vertices = round(N*rand(1, 2));	%% Vetor contendo posições do vetor solucao.caminho que guiarão as arestas a serem trocadas.
% 	j2 = solucao.caminho(vertices(1)+1);
% 	k2 = solucao.caminho(vertices(2)+1);
% 	solucao.caminho(vertices(1)+1) = k2;
% 	solucao.caminho(vertices(2)+1) = j2;
% 	
% 	novocomprimento = calcula_comprimento(N, solucao.caminho, MatDistancia);
% 	
% 	if(novocomprimento < solucao.comprimento)
% 		solucao.comprimento = novocomprimento;
% 	else
% 		solucao.caminho(vertices(1)+1) = j2;
% 		solucao.caminho(vertices(2)+1) = k2;
% 	endif
% 	
% end%function
